pip install pandas_ta

scaler_ys = MinMaxScaler(feature_range=(0,1)) scaler_y = scaler_ys.fit(np.array(train_.iloc[:training_len,0]).reshape(-1,1))

# Model for Univariate LSTM modelling #Best model #window was set to 7, entire data from 2010 was used and epoch =3 #rmse = 10.060 model_u = Sequential(name="univariate_LSTM") model_u.add(LSTM(128, return_sequences=True, input_shape= (X_train_u.shape[1], 1))) #model_u.add(Dropout(0.2)) model_u.add(LSTM(64, return_sequences=False)) model_u.add(Dropout(0.2)) model_u.add(Dense(25)) model_u.add(Dense(1)) model_u.compile(loss = 'mse', optimizer = 'adam') model_u.summary()

#Defining the LSTM layers # Model for Multiverate LSTM modelling model = Sequential(name="Multivariate-LSTM") model.add(LSTM(128, return_sequences=True, input_shape= (X_train.shape[1], X_train.shape[2]))) model.add(Dropout(0.3)) model.add(LSTM(64, return_sequences=False)) model.add(Dropout(0.2)) #model.add(BatchNormalization()) model.add(Dense(25)) model.add(BatchNormalization()) model.add(Dense(12)) model.add(Dense(1)) #model.add(LSTM(24, return_sequences=False)) #model.add(BatchNormalization()) #model.add(Dropout(0.2)) #model.add(Dense(12)) #model.add(Dense(1)) model.compile(loss = 'mse', optimizer = 'adam') model.summary() # Define early stopping callback early_stop = EarlyStopping(monitor='val_loss', patience=10, verbose=1, mode='auto')

#Predicting values from test data and train data to establish model performance predict_test = model.predict(X_test) predict_train = model.predict(X_train)

from sklearn.metrics import mean_squared_error fig, axs = plt.subplots(2) sns.lineplot(x =d_test,y = scaler_y.inverse_transform(y_test.reshape(-1,1)).reshape(-1), label = 'True', ax=axs[0]) sns.lineplot(x =d_test,y = scaler_y.inverse_transform(predict_test).reshape(-1), label = 'Predict', ax=axs[0]) axs[0].set_title('Multiverate Model Test fit') sns.lineplot(x =d_train,y = scaler_y.inverse_transform(y_train.reshape(-1,1)).reshape(-1), label = 'True', ax=axs[1]) sns.lineplot(x =d_train,y = scaler_y.inverse_transform(predict_train).reshape(-1), label = 'Predict', ax=axs[1]) axs[1].set_title('Multiverate Model Train fit') plt.tight_layout()

Scaled_Train RMSE = 0.020 Scaled_Test RMSE = 0.023 Train RMSE = 10.783 Test RMSE = 12.069

#Checks if the dataframe has dates succeding to the give date def predict_condition(date_=""): s = X_train.shape[1] if date_ != "": after_date = pd.Timestamp(date_) pred_data = np.array(df_close[after_date:].head(s)) date = df_close[after_date:].head(s)[-1:].index[0] dft = pd.DataFrame(df_close[after_date:].head(s)) else: pred_data = np.array(df_close[-s:]) date = df_close[-1:].index[0] dft = pd.DataFrame(df_close[-s:]) #Data Check print(f'\nThe Model predicts based on the data of {s} \nkindly,') print(f"choose a day before {after_date-datetime.timedelta(days=(s-len(pred_data)))} as analysis data is short by {s-len(pred_data)} days"\ if len(pred_data) < s else "wait for predictions\n\n") return pred_data, date, dft

# Plot using seaborn #Plots graphs based on the predictions(in red) in continuation to previous data points(in blue) def plot_fututre(df_future,d,dfp): st, sp = df_future.index[0].date(), df_future.index[len(df_future)-len(dfp)-1].date() spd = df_future.index[len(df_future)-len(dfp)-1+d].date() sns.set(rc={'figure.figsize':(8,6)}) sns.lineplot(df_close[st:spd], label = '', color = 'white') s = X_train.shape[1] sns.lineplot(data = df_future[:-d], x = df_future.index[:-d], y = 'Adj Close', label = 'True_past') sns.lineplot(data = df_future[-d-1:] , x = df_future.index[-d-1:], y = 'Adj Close', label = 'Predicted_Future', color = 'red') plt.xticks(rotation = 25) plt.title(f'Future Predictions for {len(df_future[-d:])} days\nagainst {len(df_future[:-d])} previous days') print(f'The model was build on data from {df.index[0].date()} to {df.index[-1].date()}') print(f'Train RMSE = {rmse_train:0.3f}\nTest RMSE = {rmse_test:0.3f}\n') print(f'\nThe predicted values are for {dfp.index[0].date()} to {dfp.index[-1].date()} i.e {d} days') print(f'based on the prices from {st} to {sp}\n')